﻿// learnimgui.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"
#include <stdio.h>
#define GL_SILENCE_DEPRECATION
#if defined(IMGUI_IMPL_OPENGL_ES2)
#include <GLES2/gl2.h>
#endif
#include <GLFW/glfw3.h> // Will drag system OpenGL headers

// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers.
// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma.
// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio.
#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS)
#pragma comment(lib, "legacy_stdio_definitions")
#endif

// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details.
#ifdef __EMSCRIPTEN__
#include "./libs/emscripten/emscripten_mainloop_stub.h"
#endif

/*
不显示控制台程序窗口
C++ 控制台程序不显示控制台黑框

1.工程属性-->连接器-->系统--->子系统：选择窗口
2.程序入口添加代码：
#include<windows.h>
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup")
*/

#pragma comment(linker, "/subsystem:windows /entry:mainCRTStartup")

static void glfw_error_callback(int error, const char* description)
{
	fprintf(stderr, "GLFW Error %d: %s\n", error, description);
}

void DrawContent();

int main(int argc, char** argv)
{
	//std::cout << "Hello World!\n";

	glfwSetErrorCallback(glfw_error_callback);
	if (!glfwInit())
		return 1;

	// Decide GL+GLSL versions
#if defined(IMGUI_IMPL_OPENGL_ES2)
	// GL ES 2.0 + GLSL 100
	const char* glsl_version = "#version 100";
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
	glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
#elif defined(__APPLE__)
	// GL 3.2 + GLSL 150
	const char* glsl_version = "#version 150";
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // Required on Mac
#else
	// GL 3.0 + GLSL 130
	const char* glsl_version = "#version 130";
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
	//glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // 3.0+ only
#endif

		// Create window with graphics context
	GLFWwindow* window = glfwCreateWindow(1280, 720, "Learn ImGui GLFW+OpenGL3 example", nullptr, nullptr);
	if (window == nullptr)
		return 1;
	glfwMakeContextCurrent(window);
	glfwSwapInterval(1); // Enable vsync

	// Setup Dear ImGui context
	IMGUI_CHECKVERSION();
	ImGui::CreateContext();
	ImGuiIO& io = ImGui::GetIO(); (void)io;
	io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;     // Enable Keyboard Controls
	io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;      // Enable Gamepad Controls

	// Setup Dear ImGui style
	ImGui::StyleColorsDark();
	//ImGui::StyleColorsLight();

	// Setup Platform/Renderer backends
	ImGui_ImplGlfw_InitForOpenGL(window, true);
	ImGui_ImplOpenGL3_Init(glsl_version);

	// Load Fonts
	io.Fonts->AddFontDefault();

	//
	ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);

	// Main loop
#ifdef __EMSCRIPTEN__
	// For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file.
	// You may manually call LoadIniSettingsFromMemory() to load settings from your own storage.
	io.IniFilename = nullptr;
	EMSCRIPTEN_MAINLOOP_BEGIN
#else
	while (!glfwWindowShouldClose(window))
#endif
	{
		glfwPollEvents();

		// Start the Dear ImGui frame
		ImGui_ImplOpenGL3_NewFrame();
		ImGui_ImplGlfw_NewFrame();
		ImGui::NewFrame();

		DrawContent();

		// Rendering
		ImGui::Render();
		int display_w, display_h;
		glfwGetFramebufferSize(window, &display_w, &display_h);
		glViewport(0, 0, display_w, display_h);
		glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
		glClear(GL_COLOR_BUFFER_BIT);
		ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

		glfwSwapBuffers(window);
	}

	// Cleanup
	ImGui_ImplOpenGL3_Shutdown();
	ImGui_ImplGlfw_Shutdown();
	ImGui::DestroyContext();

	//shutdown glfw
	glfwDestroyWindow(window);
	glfwTerminate();

	return 0;
}

const char* NAME_MainWindow = "MainWindow";

void ShowDialog(const char* title);
void ShowWindow(const char* title);
int k = 0;
void DrawContent()
{
	bool open = true;
	int flags =
		ImGuiWindowFlags_NoTitleBar   //隐藏标题栏
		| ImGuiWindowFlags_NoMove		//不可移动
		| ImGuiWindowFlags_NoResize		//不可调整大小
		| ImGuiWindowFlags_MenuBar //有菜单栏
		| ImGuiWindowFlags_AlwaysUseWindowPadding;
	ImGui::Begin(NAME_MainWindow, &open, flags);
	if (ImGui::BeginMenuBar())
	{
		if (ImGui::BeginMenu("File"))
		{
			if (ImGui::MenuItem("Open..", "Ctrl+O"))
			{
			}
			if (ImGui::MenuItem("Save", "Ctrl+S"))
			{
			}
			if (ImGui::MenuItem("Close", "Ctrl+W"))
			{
			}
			ImGui::EndMenu();
		}
		if (ImGui::BeginMenu("Help"))
		{
			if (ImGui::MenuItem("About", "Ctrl+B"))
			{
				k++;
			}
			ImGui::EndMenu();
		}
		ImGui::EndMenuBar();
	}
	auto io = ImGui::GetIO();
	ImVec2 size = io.DisplaySize; //获取glfw窗体大小
	ImGui::SetWindowSize(size, 0);//设置当前窗体大小

	ImGui::Text("Size W:%f,H:%f", size[0], size[1]);//显示窗体信息
	ImVec2 mpos = io.MousePos;
	ImGui::Text("Mouse Pos X:%f,Y:%f", mpos[0], mpos[1]);

	ImVec2 pos;
	ImGui::SetWindowPos(pos, 0);//设置当前窗体位置
	ImGui::End();

	if (k % 2 == 1)
		ShowDialog("About");
}

void ShowWindow(const char* title)
{
	ImGui::Begin("title");

	ImGui::End();
}

void ShowDialog(const char* title)
{
	bool show = true;
	ImGui::Begin(title, &show, ImGuiWindowFlags_NoNav);
	ImVec2 size;
	size[0] = 400;
	size[1] = 400;
	ImGui::SetWindowSize(size, 0);//设置当前窗体大小

	ImGui::Text("hello %s", title);
	ImGui::End();
}